package basicx.oop.agent

import org.eliza.base.contantx.LetYou

/*-*- coding:utf-8 -*-
* @Author  : ygree 
* @Time    : 2021/6/29 21:50
* @Software : IntelliJ IDEA
*/

/*
委托是把事情托付给别人或别的机构办理
    代理是指以他人的名义，在授权范围内进行对被代理人直接发生法律效力的法律行为。
    代理的产生，可以是受他人委托
*/
private interface IWashBowling {
    fun washings()
}

private class Child : IWashBowling {
    override fun washings() {
        println("儿子洗碗很痛苦")
    }
}

private class Father : IWashBowling {
    override fun washings() {
        println("父亲洗碗很痛苦")
    }
}

// by --> class Father()
private class Mother : IWashBowling by Father() {

    // 代理
    // 什么都不写-->父亲洗碗很痛苦
    override fun washings() {
        val father = Father()
        println("Mother let:${father} ${LetYou.random()}")
        father.washings() // 让父亲来做
        println("Mother let:${father}")
    }
}

private  fun main() {
    var schild01 = Child()
    // 委托具体的对象
    var smother01 = Mother()
    smother01.washings()  //委托 同一个father对象

    println("---------")
    var smother02 = Mother()
    smother02.washings()
    println("---------")
    println("${schild01.equals(smother02)}") // false
    println("${smother01 == smother02}") // false
    // 每当mother调用一次 washings()方法，就会创建一个临时对象
    // 想使每次代理是 同一个对象
}